home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 701-725 / 708 / intuisup / intuisup42.lha / Intuisup / source.lha / Editor / list.c < prev    next >
C/C++ Source or Header  |  1992-03-21  |  10KB  |  315 lines

  1. /* $Revision Header *** Header built automatically - do not edit! ***********
  2.  *
  3.  *    (C) Copyright 1991 by Torsten Jürgeleit
  4.  *
  5.  *    Name .....: list.c
  6.  *    Created ..: Sunday 22-Dec-91 21:22:40
  7.  *    Revision .: 0
  8.  *
  9.  *    Date        Author                 Comment
  10.  *    =========   ====================   ====================
  11.  *    22-Dec-91   Torsten Jürgeleit      Created this file!
  12.  *
  13.  ****************************************************************************
  14.  *
  15.  *    Text list part
  16.  *
  17.  * $Revision Header ********************************************************/
  18.  
  19.     /* Includes */
  20.  
  21. #include "includes.h"
  22. #include "defines.h"
  23. #include "imports.h"
  24. #include "protos.h"
  25.  
  26.     /* Defines for text list editor gadgets */
  27.  
  28. #define LIST_GADGET_LISTVIEW        0
  29. #define LIST_GADGET_STRING        1
  30. #define LIST_GADGET_EDIT        2
  31. #define LIST_GADGET_ADD            3
  32. #define LIST_GADGET_INSERT        4
  33. #define LIST_GADGET_DELETE        5
  34.  
  35. #define LIST_GADGET1_TYPE        GADGET_DATA_TYPE_LISTVIEW
  36. #define LIST_GADGET1_FLAGS        GADGET_DATA_FLAG_HOTKEY
  37. #define LIST_GADGET1_TEXT        "Text _list"
  38. #define LIST_GADGET1_LEFT_EDGE        10
  39. #define LIST_GADGET1_TOP_EDGE        28
  40. #define LIST_GADGET1_WIDTH        196
  41. #define LIST_GADGET1_HEIGHT        31
  42. #define LIST_GADGET1_TEXT_ATTR        &topaz80_attr
  43. #define LIST_GADGET1_SPACING        1
  44. #define LIST_GADGET1_TOP        0
  45. #define LIST_GADGET1_LIST        NULL
  46.  
  47. #define LIST_GADGET2_TYPE        GADGET_DATA_TYPE_STRING
  48. #define LIST_GADGET2_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  49. #define LIST_GADGET2_LEFT_EDGE        LIST_GADGET1_LEFT_EDGE
  50. #define LIST_GADGET2_TOP_EDGE        (LIST_GADGET1_TOP_EDGE + LIST_GADGET1_HEIGHT + 1)
  51. #define LIST_GADGET2_WIDTH        (LIST_GADGET1_WIDTH - (4 + 1) * 8)
  52. #define LIST_GADGET2_HEIGHT        12
  53. #define LIST_GADGET2_TEXT        "_Text"
  54. #define LIST_GADGET2_TEXT_ATTR        &topaz80_attr
  55. #define LIST_GADGET2_INPUT_LEN        80
  56. #define LIST_GADGET2_INPUT_NEXT        0
  57. #define LIST_GADGET2_INPUT_DEFAULT    NULL
  58.  
  59. #define LIST_GADGET3_TYPE        GADGET_DATA_TYPE_BUTTON
  60. #define LIST_GADGET3_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  61. #define LIST_GADGET3_LEFT_EDGE        LIST_GADGET1_LEFT_EDGE
  62. #define LIST_GADGET3_TOP_EDGE        (LIST_GADGET2_TOP_EDGE + LIST_GADGET2_HEIGHT + 3)
  63. #define LIST_GADGET3_WIDTH        ((LIST_GADGET1_WIDTH - 3 * 4) / 4)
  64. #define LIST_GADGET3_HEIGHT        13
  65. #define LIST_GADGET3_TEXT        "_Edit"
  66. #define LIST_GADGET3_TEXT_ATTR        &topaz80_attr
  67.  
  68. #define LIST_GADGET4_TYPE        GADGET_DATA_TYPE_BUTTON
  69. #define LIST_GADGET4_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  70. #define LIST_GADGET4_LEFT_EDGE        (LIST_GADGET3_LEFT_EDGE + LIST_GADGET3_WIDTH + 4)
  71. #define LIST_GADGET4_TOP_EDGE        LIST_GADGET3_TOP_EDGE
  72. #define LIST_GADGET4_WIDTH        LIST_GADGET3_WIDTH
  73. #define LIST_GADGET4_HEIGHT        LIST_GADGET3_HEIGHT
  74. #define LIST_GADGET4_TEXT        "_Add"
  75. #define LIST_GADGET4_TEXT_ATTR        &topaz80_attr
  76.  
  77. #define LIST_GADGET5_TYPE        GADGET_DATA_TYPE_BUTTON
  78. #define LIST_GADGET5_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  79. #define LIST_GADGET5_LEFT_EDGE        (LIST_GADGET4_LEFT_EDGE + LIST_GADGET4_WIDTH + 4)
  80. #define LIST_GADGET5_TOP_EDGE        LIST_GADGET4_TOP_EDGE
  81. #define LIST_GADGET5_WIDTH        LIST_GADGET4_WIDTH
  82. #define LIST_GADGET5_HEIGHT        LIST_GADGET4_HEIGHT
  83. #define LIST_GADGET5_TEXT        "_Ins"
  84. #define LIST_GADGET5_TEXT_ATTR        &topaz80_attr
  85.  
  86. #define LIST_GADGET6_TYPE        GADGET_DATA_TYPE_BUTTON
  87. #define LIST_GADGET6_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  88. #define LIST_GADGET6_LEFT_EDGE        (LIST_GADGET5_LEFT_EDGE + LIST_GADGET5_WIDTH + 4)
  89. #define LIST_GADGET6_TOP_EDGE        LIST_GADGET5_TOP_EDGE
  90. #define LIST_GADGET6_WIDTH        LIST_GADGET5_WIDTH
  91. #define LIST_GADGET6_HEIGHT        LIST_GADGET5_HEIGHT
  92. #define LIST_GADGET6_TEXT        "_Del"
  93. #define LIST_GADGET6_TEXT_ATTR        &topaz80_attr
  94.  
  95.     /* Statics for text list editor gadgets */
  96.  
  97. struct GadgetData  list_gadget_data[] = {
  98.    {
  99.     LIST_GADGET1_TYPE,        /* gd_Type */
  100.     LIST_GADGET1_FLAGS,        /* gd_Flags */
  101.     LIST_GADGET1_LEFT_EDGE,        /* gd_LeftEdge */
  102.     LIST_GADGET1_TOP_EDGE,        /* gd_TopEdge */
  103.     LIST_GADGET1_WIDTH,        /* gd_Width */
  104.     LIST_GADGET1_HEIGHT,        /* gd_Height */
  105.     LIST_GADGET1_TEXT,        /* *gd_Text */
  106.     LIST_GADGET1_TEXT_ATTR,        /* *gd_TextAttr */
  107.     {
  108.     LIST_GADGET1_SPACING,        /* gd_ListViewSpacing */
  109.     LIST_GADGET1_TOP,        /* gd_ListViewTop */
  110.     LIST_GADGET1_LIST        /* gd_ListViewList */
  111.     }
  112.    }, {
  113.     LIST_GADGET2_TYPE,        /* gd_Type */
  114.     LIST_GADGET2_FLAGS,        /* gd_Flags */
  115.     LIST_GADGET2_LEFT_EDGE,        /* gd_LeftEdge */
  116.     LIST_GADGET2_TOP_EDGE,        /* gd_TopEdge */
  117.     LIST_GADGET2_WIDTH,        /* gd_Width */
  118.     LIST_GADGET2_HEIGHT,        /* gd_Height */
  119.     LIST_GADGET2_TEXT,        /* *gd_Text */
  120.     LIST_GADGET2_TEXT_ATTR,        /* *gd_TextAttr */
  121.     {
  122.     LIST_GADGET2_INPUT_LEN,        /* gd_InputLen */
  123.     LIST_GADGET2_INPUT_NEXT,    /* gd_InputActivateNext/Prev */
  124.     LIST_GADGET2_INPUT_DEFAULT    /* gd_InputDefault */
  125.     }
  126.    }, {
  127.     LIST_GADGET3_TYPE,        /* gd_Type */
  128.     LIST_GADGET3_FLAGS,        /* gd_Flags */
  129.     LIST_GADGET3_LEFT_EDGE,        /* gd_LeftEdge */
  130.     LIST_GADGET3_TOP_EDGE,        /* gd_TopEdge */
  131.     LIST_GADGET3_WIDTH,        /* gd_Width */
  132.     LIST_GADGET3_HEIGHT,        /* gd_Height */
  133.     LIST_GADGET3_TEXT,        /* *gd_Text */
  134.     LIST_GADGET3_TEXT_ATTR,        /* *gd_TextAttr */
  135.     { 0, 0, 0 }
  136.    }, {
  137.     LIST_GADGET4_TYPE,        /* gd_Type */
  138.     LIST_GADGET4_FLAGS,        /* gd_Flags */
  139.     LIST_GADGET4_LEFT_EDGE,        /* gd_LeftEdge */
  140.     LIST_GADGET4_TOP_EDGE,        /* gd_TopEdge */
  141.     LIST_GADGET4_WIDTH,        /* gd_Width */
  142.     LIST_GADGET4_HEIGHT,        /* gd_Height */
  143.     LIST_GADGET4_TEXT,        /* *gd_Text */
  144.     LIST_GADGET4_TEXT_ATTR,        /* *gd_TextAttr */
  145.     { 0, 0, 0 }
  146.    }, {
  147.     LIST_GADGET5_TYPE,        /* gd_Type */
  148.     LIST_GADGET5_FLAGS,        /* gd_Flags */
  149.     LIST_GADGET5_LEFT_EDGE,        /* gd_LeftEdge */
  150.     LIST_GADGET5_TOP_EDGE,        /* gd_TopEdge */
  151.     LIST_GADGET5_WIDTH,        /* gd_Width */
  152.     LIST_GADGET5_HEIGHT,        /* gd_Height */
  153.     LIST_GADGET5_TEXT,        /* *gd_Text */
  154.     LIST_GADGET5_TEXT_ATTR,    /* *gd_TextAttr */
  155.     { 0, 0, 0 }
  156.    }, {
  157.     LIST_GADGET6_TYPE,        /* gd_Type */
  158.     LIST_GADGET6_FLAGS,        /* gd_Flags */
  159.     LIST_GADGET6_LEFT_EDGE,        /* gd_LeftEdge */
  160.     LIST_GADGET6_TOP_EDGE,        /* gd_TopEdge */
  161.     LIST_GADGET6_WIDTH,        /* gd_Width */
  162.     LIST_GADGET6_HEIGHT,        /* gd_Height */
  163.     LIST_GADGET6_TEXT,        /* *gd_Text */
  164.     LIST_GADGET6_TEXT_ATTR,        /* *gd_TextAttr */
  165.     { 0, 0, 0 }
  166.    }, {
  167.     INTUISUP_DATA_END        /* mark end of gadget data array */
  168.    }
  169. };
  170. STATIC struct Node  *last_node;        /* last selected text list entry */
  171. STATIC BYTE   *last_text;        /* last text defined by string gadget */
  172. STATIC USHORT list_mode;
  173.  
  174.     /* Change mode of text list editor mode */
  175.  
  176.    VOID
  177. change_text_list_editor_mode(APTR gl, USHORT mode)
  178. {
  179.    /* Unselect old mode gadget */
  180.    ISetGadgetAttributes(gl, LIST_GADGET_EDIT + list_mode, 0L, 0L, 0L,
  181.                   USE_CURRENT_VALUE, (VOID *)USE_CURRENT_VALUE);
  182.    /* Select new mode gadget */
  183.    ISetGadgetAttributes(gl, LIST_GADGET_EDIT + mode, 0L, 0L, 1L,
  184.                   USE_CURRENT_VALUE, (VOID *)USE_CURRENT_VALUE);
  185.    list_mode = mode;
  186.  
  187.    /* Reset string gadget and some variables */
  188.    ISetGadgetAttributes(gl, LIST_GADGET_STRING, 0L, 0L, USE_CURRENT_VALUE,
  189.                            USE_CURRENT_VALUE, NULL);
  190.    last_node = NULL;
  191.    last_text = NULL;
  192. }
  193.     /* Perform gadget action text list editor */
  194.  
  195.    SHORT
  196. perform_text_list_editor_action(APTR gl, struct Template  *tp, USHORT entry,
  197.                                 ULONG value)
  198. {
  199.    struct List  *list = &tp->tp_TextList;
  200.    struct Node  *node;
  201.    SHORT status = EDITOR_STATUS_NORMAL;
  202.  
  203.    switch (entry) {
  204.       case LIST_GADGET_LISTVIEW :
  205.      node = last_node = get_node(list, (USHORT)value);
  206.      switch (list_mode) {
  207.         case LIST_MODE_EDIT :
  208.         case LIST_MODE_ADD :
  209.  
  210.            /* Copy selected text to string gadget */
  211.            ISetGadgetAttributes(gl, LIST_GADGET_STRING, 0L, 0L,
  212.                USE_CURRENT_VALUE, USE_CURRENT_VALUE, node->ln_Name);
  213.            break;
  214.  
  215.         case LIST_MODE_INSERT :
  216.  
  217.            /* Insert text from string gadget before selected entry */
  218.            if (last_text) {
  219.           struct Node  *list_node = get_pred(node);
  220.  
  221.           if (!(node = build_text_list_entry(last_text))) {
  222.              status = EDITOR_ERROR_OUT_OF_MEM;
  223.           } else {
  224.              Insert(list, node, list_node);
  225.              ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L, 0L,
  226.                 USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  227.           }
  228.            }
  229.            break;
  230.  
  231.         case LIST_MODE_DELETE :
  232.  
  233.            /* Delete selected entry */
  234.            Remove(node);
  235.            free_text_list_entry(node);
  236.            ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L, 0L,
  237.                 USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  238.            break;
  239.      }
  240.      break;
  241.  
  242.       case LIST_GADGET_STRING :
  243.      last_text = (BYTE *)value;
  244.      switch (list_mode) {
  245.         case LIST_MODE_EDIT :
  246.  
  247.            /* Replace text of last selected entry by this one */
  248.            if (last_node) {
  249.           BYTE *text;
  250.  
  251.           if (!(text = DosAllocMem((LONG)(strlen((BYTE *)value) +
  252.                                      1)))) {
  253.              status = EDITOR_ERROR_OUT_OF_MEM;
  254.           } else {
  255.              DosFreeMem(last_node->ln_Name);
  256.              last_node->ln_Name = text;
  257.              strcpy(text, (BYTE *)value);
  258.              ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L, 0L,
  259.                 USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  260.           }
  261.            }
  262.            break;
  263.  
  264.         case LIST_MODE_ADD :
  265.  
  266.            /* Add text to end of list */
  267.            if (!(node = build_text_list_entry((BYTE *)value))) {
  268.           status = EDITOR_ERROR_OUT_OF_MEM;
  269.            } else {
  270.           AddTail(list, node);
  271.           ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L, 0L,
  272.                 USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  273.            }
  274.            break;
  275.      }
  276.      break;
  277.  
  278.       default :
  279.  
  280.      /* Set new text list editor mode */
  281.      change_text_list_editor_mode(gl, entry - LIST_GADGET_EDIT);
  282.      break;
  283.    }
  284.    if (status == EDITOR_STATUS_NORMAL) {
  285.       struct GadgetData  *gd = &tp->tp_Data.tp_GadgetData;
  286.       BYTE **text_array;
  287.  
  288.       /* Change template data */
  289.       switch (gd->gd_Type) {
  290.      case GADGET_DATA_TYPE_MX :
  291.         text_array = gd->gd_SpecialData.gd_MXData.gd_MXTextArray;
  292.         if ((status = build_template_text_array(tp)) !=
  293.                              EDITOR_STATUS_NORMAL) {
  294.            gd->gd_SpecialData.gd_MXData.gd_MXTextArray = text_array;
  295.         } else {
  296.            DosFreeMem(text_array);
  297.         }
  298.         break;
  299.      case GADGET_DATA_TYPE_CYCLE :
  300.         text_array = gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray;
  301.         if ((status = build_template_text_array(tp)) !=
  302.                              EDITOR_STATUS_NORMAL) {
  303.            gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray = text_array;
  304.         } else {
  305.            DosFreeMem(text_array);
  306.         }
  307.         break;
  308.      case GADGET_DATA_TYPE_LISTVIEW :
  309.         gd->gd_SpecialData.gd_ListViewData.gd_ListViewList = &tp->tp_TextList;
  310.         break;
  311.       }
  312.    }
  313.    return(status);
  314. }
  315.